package com.hmdp.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

/**
 * @Author wzh
 * @create 2022/6/2 11:25
 * @Description： 基于redis的id生成器
 */
@Component
public class RedisIdWork {
//    开始的时间戳
    private static final Long BEGIN_TIMESTAMP=1654128000L;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    /**
     * 序列号位数
     */
    private static final int COUNT_BITS=32;

    public Long nextId(String prefix){
//    定义时间戳
        LocalDateTime now = LocalDateTime.now();//获取当前时间
        long nowsecond = now.toEpochSecond(ZoneOffset.UTC);//获取当前秒数
      Long timeStamp=nowsecond-BEGIN_TIMESTAMP;
//         生成序列号
//        获取当前日期，精确到天
        String data = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
//        自增长
        Long count = stringRedisTemplate.opsForValue().increment("irc" + prefix + ":"+data);//含有统计效果,可以统计当天的销量

//   拼接并返回
        return timeStamp<<COUNT_BITS|count;

    }

    public static void main(String[] args) {
        LocalDateTime time=LocalDateTime.of(2022,6,2,0,0,0);
/**
 * 在Java 9中，LocalDate类提供了toEpochSecond()方法，以将本地日期转换为纪元秒。
 * toEpochSecond()方法将LocalDate转换为自1970-01-01T00：00：00Z纪元以来的秒数。
 * 可以将LocalDate与给定的时间和区域偏移量结合使用，以计算从1970-01-01T00：00：00Z开始的秒数。
 */
        long second = time.toEpochSecond(ZoneOffset.UTC);
        System.out.println("second="+second);
    }

}
